package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()                                                                       //获取当前时间
	fmt.Println(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second()) //获取当前时间的具体时分秒
	fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())

	fmt.Println("输出时间戳")
	fmt.Println(time.Now().Unix())     //获取unix时间戳
	fmt.Println(time.Now().UnixNano()) //获取纳秒时间戳

	fmt.Println("时间戳转换为时间对象")
	fmt.Println(time.Unix(1606642915, 0)) //将时间戳转换成时间对象

	fmt.Println("时间的加减操作")
	currTime := time.Unix(1606642915, 0)
	nextTime := currTime.Add(1 * time.Minute)
	fmt.Println(nextTime)                       //给时间加上一个时间间隔
	fmt.Println(int64(nextTime.Sub(currTime)))  //计算两个时间的差
	fmt.Println(nextTime.Sub(currTime).Hours()) //计算两个时间的差的小时数

	fmt.Println("判断时间的相等")
	fmt.Println(currTime.Equal(nextTime))  //判断两个时间是否相等
	fmt.Println(currTime.After(nextTime))  //判断两个时间的前后关系
	fmt.Println(currTime.Before(nextTime)) //判断两个时间的前后关系

	//定义一个没两秒执行一次的定时器
	/*ticker := time.Tick(2 * time.Second)
	for t := range ticker {
		fmt.Println(t)
	}*/

	//这个是只执行一次的定时任务
	/*timer := time.NewTimer(5*time.Second)
	<-timer.C
	fmt.Println("延迟5秒打印")*/

	fmt.Println("-----时间格式化------")
	// 格式化的模板为Go的出生时间2006年1月2号15点04分 Mon Jan
	// 24小时制
	fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
	// 12小时制
	fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
	fmt.Println(now.Format("2006-01-02 15:04:05.000"))
	fmt.Println(now.Format("2006/01/02 15:04"))
	fmt.Println(now.Format("15:04 2006/01/02"))
	fmt.Println(now.Format("2006/01/02"))

	// 加载时区
	loc, err := time.LoadLocation("Asia/Shanghai")
	if err != nil {
		fmt.Println(err)
		return
	}
	// 按照指定时区和指定格式解析字符串时间
	timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/11/29 18:07:26", loc)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("创建的时间对象：", timeObj)
	fmt.Println("加载时间跟现在时间相差时间间隔", timeObj.Sub(now))

	//给当前时间增加一个月后的日期
	//发现这个函数有点坑，在Java中，如果1月31日加一个月的话会变成2月的最后一天，但是Go中是直接加了
	fmt.Println("当前时间增加一个月：", time.Now().AddDate(0, 3, 0))
	oneMonth, err := time.Parse("2006-01-02 15:04:05", "2006-01-31 15:04:05")
	fmt.Println("当前时间增加一个月：", oneMonth.AddDate(0, 1, 0))

	//默认的Parse解析的时区是0时区的时间
	tmpTime1, err := time.Parse("2006-01-02 15:04:05", "2020-11-29 22:29:17")
	tmpTime2, err := time.ParseInLocation("2006-01-02 15:04:05", "2020-11-29 22:29:17", loc)

	fmt.Println(tmpTime1)
	fmt.Println(tmpTime2)
	fmt.Println(time.Now())
	fmt.Println(tmpTime1.Sub(time.Now()))

	//可以使用isZero来判断是否为空时间
	var thisTime time.Time
	fmt.Println(thisTime.IsZero())
	fmt.Println(tmpTime1.IsZero())

}
